const randomstring = require('randomstring');
const querystring = require('querystring');
const config = require('../config');
const md5 = require('md5');
const xml2js = require('xml2js');

// 获取随机字符串32位
exports.getRandomString = (n) => {
  return randomstring.generate(n)
}

// 生成签名
exports.getSign = (_prepay) => {
  // 要发送的参数 _prepay
  // 将对象的属性按ascll码值从小到大排列
  // 使用Object方法获取对象中的key值，为一个数组
  // 对数组进行排序，遍历向一个空对象中添加key、value
  const obj = Object.keys(_prepay).sort().reduce((prev, key) => {
    prev[key] = _prepay[key];
    return prev
  }, {});
  // 使用querystring模块处理obj为ulr形式并且使其不被编码（加密）
  const stringA = querystring.stringify(obj, null, null, {
    encodeURIComponent: (value) => {
      return decodeURIComponent(value)
    }
  });
  // 拼接API密钥key
  const stringSignTemp = stringA + '&key=' + config.key;
  // MD5签名：使用md5加密并将字符串全部转为大写
  const sign = md5(stringSignTemp).toLocaleUpperCase();
  // 返回生成的最终签名
  return sign;
}

// js对象转xml
exports.getXml = (obj) => {
  const builder = new xml2js.Builder({
    rootName: 'xml'
  });
  const xml = builder.buildObject(obj);
  return xml
}

// xml转js对象
exports.getJs = (xml) => {
  let json = null;
  xml2js.parseString(xml, (err, result) => {
    if (err) throw err;
    json = result.xml
  })
  return json
}

